"""
邮箱服务器配置文件
包含数据库连接、安全密钥、应用配置等
支持从config.json文件读取配置参数
"""
import os
import json
from datetime import timedelta

def load_json_config():
    """
    加载JSON配置文件
    返回配置字典，如果文件不存在则返回空字典
    """
    config_path = os.path.join(os.path.dirname(__file__), 'config.json')
    try:
        with open(config_path, 'r', encoding='utf-8') as f:
            return json.load(f)
    except (FileNotFoundError, json.JSONDecodeError) as e:
        print(f"警告: 无法加载config.json文件: {e}")
        return {}

# 加载JSON配置
json_config = load_json_config()

def get_config_value(section, key, default_value=None):
    """
    从JSON配置中获取配置值
    优先级: 环境变量 > JSON配置 > 默认值
    """
    # 首先检查是否有对应的环境变量
    if section in json_config and key in json_config[section]:
        config_item = json_config[section][key]
        if isinstance(config_item, dict) and 'env_var' in config_item:
            env_value = os.environ.get(config_item['env_var'])
            if env_value is not None:
                return env_value
        
        # 返回JSON配置中的值
        if isinstance(config_item, dict) and 'value' in config_item:
            return config_item['value']
        else:
            return config_item
    
    # 返回默认值
    return default_value

class Config:
    """基础配置类"""
    # 安全密钥
    SECRET_KEY = get_config_value('security', 'secret_key', 'your-secret-key-change-in-production')
    
    # 数据库配置
    SQLALCHEMY_DATABASE_URI = get_config_value('database', 'database_uri', 'sqlite:///mailserver.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = get_config_value('database', 'track_modifications', False)
    
    # JWT配置
    JWT_SECRET_KEY = get_config_value('security', 'jwt_secret_key', 'jwt-secret-string')
    JWT_ACCESS_TOKEN_EXPIRES = timedelta(hours=get_config_value('security', 'jwt_access_token_expires_hours', 24))
    
    # 邮件配置
    MAIL_PER_PAGE = get_config_value('email_system', 'mail_per_page', 10)
    MAX_CONTENT_LENGTH = get_config_value('email_system', 'max_content_length_mb', 16) * 1024 * 1024  # 转换为字节
    
    # 邮箱服务器配置
    EMAIL_DOMAIN = get_config_value('email_system', 'email_domain', 'mailserver.local')
    
    # 应用配置
    APP_NAME = get_config_value('application', 'app_name', '简易邮箱服务器')
    APP_VERSION = get_config_value('application', 'app_version', '1.0.0')
    
    # CSRF保护配置
    WTF_CSRF_ENABLED = get_config_value('security', 'csrf_enabled', True)
    WTF_CSRF_TIME_LIMIT = get_config_value('security', 'csrf_time_limit', 3600)
    
    # 管理员默认账号
    DEFAULT_ADMIN_USERNAME = get_config_value('admin_account', 'default_admin_username', 'admin')
    DEFAULT_ADMIN_EMAIL = f'admin@{EMAIL_DOMAIN}'
    DEFAULT_ADMIN_PASSWORD = get_config_value('admin_account', 'default_admin_password', 'admin123')
    
    # 服务器配置
    HOST = get_config_value('server', 'host', '0.0.0.0')
    PORT = get_config_value('server', 'port', 5000)
    DEBUG = False

class DevelopmentConfig(Config):
    """开发环境配置"""
    DEBUG = get_config_value('environment_configs', 'development', {}).get('debug', {}).get('value', True)
    SQLALCHEMY_DATABASE_URI = get_config_value('environment_configs', 'development', {}).get('database_uri', {}).get('value', 'sqlite:///mailserver_dev.db')

class ProductionConfig(Config):
    """生产环境配置"""
    DEBUG = get_config_value('environment_configs', 'production', {}).get('debug', {}).get('value', False)
    # 生产环境应该使用更安全的密钥
    SECRET_KEY = get_config_value('security', 'secret_key', 'production-secret-key')

class TestingConfig(Config):
    """测试环境配置"""
    TESTING = get_config_value('environment_configs', 'testing', {}).get('testing', {}).get('value', True)
    SQLALCHEMY_DATABASE_URI = get_config_value('environment_configs', 'testing', {}).get('database_uri', {}).get('value', 'sqlite:///:memory:')
    WTF_CSRF_ENABLED = get_config_value('environment_configs', 'testing', {}).get('csrf_enabled', {}).get('value', False)

# 配置字典
config = {
    'development': DevelopmentConfig,
    'production': ProductionConfig,
    'testing': TestingConfig,
    'default': DevelopmentConfig
}